package pwd.allen.aop.pointcut;

import org.springframework.aop.ClassFilter;
import org.springframework.aop.support.DynamicMethodMatcherPointcut;
import pwd.allen.aop.MyAop;

import java.lang.reflect.Method;

/**
 * @author 门那粒沙
 * @create 2020-08-30 15:32
 **/
public class MyDynamicPointcut extends DynamicMethodMatcherPointcut {

    /**
     * 动态检查：只处理第一个参数大于10的
     * 推荐在这里做参数检查
     *
     * @param method
     * @param targetClass
     * @param args
     * @return
     */
    @Override
    public boolean matches(Method method, Class<?> targetClass, Object... args) {
        System.out.println("Dynamic check for " + method.getName());
        Integer a = (Integer) args[0];
        return a > 10;
    }

    /**
     * 静态检查，默认返回true
     * 推荐在这里做方法检查
     *
     * @param method
     * @param targetClass
     * @return
     */
    @Override
    public boolean matches(Method method, Class<?> targetClass) {
        System.out.println("Static check for " + method.getName());
        return method.getName().equals("divide");
    }

    /**
     * 静态检查，默认返回true，即不过滤任何类
     * 重写类过滤逻辑，只处理MyAop类型
     * 推荐在这里做类检查
     *
     * @return
     */
    @Override
    public ClassFilter getClassFilter() {
        System.out.println("getClassFilter");
        return new ClassFilter() {
            @Override
            public boolean matches(Class<?> clazz) {
                System.out.println("Static check for " + clazz.getName());
                return clazz == MyAop.class;
            }
        };
    }
}
